// filename: costumer.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <semaphore.h>
#define SHM_SIZE 1024
#define SEM_NAME "./my_semaphore1"
#define BUFFER_SIZE 100
int main() {
    key_t key = ftok("producer.c", 65);
    int shmid;
    char *shmaddr;
    sem_t *semaphore;
    // 通过键值连接到共享内存
    if ((shmid = shmget(key, SHM_SIZE, 0666)) == -1) {
        perror("shmget");
        exit(1);
    }
    // 附加共享内存
    shmaddr = shmat(shmid, (void*)0, 0);
    if (shmaddr == (char*)-1) {
        perror("shmat");
        exit(1);
    }
    // 连接到信号量
    semaphore = sem_open(SEM_NAME, 0);
    if (semaphore == SEM_FAILED) {
        perror("sem_open");
        exit(1);
    }
    // 消费数据
    for(int i = 0; i < BUFFER_SIZE; ++i) {
        sem_wait(semaphore); // 等待信号量，确保有数据可读
        printf("Consumed: %s\n", shmaddr + (i * sizeof(char)*10));
        sleep(1); // 模拟消费间隔
    }
    // 清理
    shmdt(shmaddr);
    // 注意：在实际应用中，可能需要确保所有消费者都完成了消费之后再考虑删除共享内存
    sem_close(semaphore);
    return 0;
}